6.1 goroutine

Go语言中,使用的是协程的概念,也就是goroutine,可以理解为就是一个轻量级的线程。

协程的开销极低,所以我们可以开启大量的协程支持我们的业务实现,这对于并发要求较高的系统是非常友好的。

本节代码存放目录为 lesson16

使用协程

更多底层的东西Go语言官方已经为我们封装好了,我们只需要进行使用即可。

Go语言中,我们使用go关键字就可以快速的开启一个协程。如下代码所示:

go func() {
    for {
        fmt.Printf("当前时间戳: %d\n", time.Now().Unix())
        time.Sleep(time.Duration(1) * time.Second)
    }
}()

在上面的代码中,我们开启了一个协程,每隔1秒打印一次当前的秒级时间戳。

从上面的代码可以看出,开始的标准格式就是这样的:

go func() {
    // 逻辑代码
}()

有的时候,我们会将一些逻辑封装在一个函数中,那么我们可以这样写:

func printNumber() {
    for i := 0; i < 100; i++ {
        fmt.Printf("printNumber: %d\n", i)
        time.Sleep(time.Duration(1) * time.Second)
    }
}

在调用的时候,我们通过go关键词加上函数名称即可,如下所示:

go printNumber()

结合上面的代码,我们的完整示例代码如下:

func main() {
    go func() {
        for {
            fmt.Printf("当前时间戳: %d\n", time.Now().Unix())
            time.Sleep(time.Duration(1) * time.Second)
        }
    }()

    go printNumber()

    select {}
}

func printNumber() {
    for i := 0; i < 100; i++ {
        fmt.Printf("printNumber: %d\n", i)
        time.Sleep(time.Duration(1) * time.Second)
    }
}

执行示例代码输出结果如下:

printNumber: 0
当前时间戳: 1723790742
当前时间戳: 1723790743
printNumber: 1
printNumber: 2
当前时间戳: 1723790744
printNumber: 3
当前时间戳: 1723790745

从结果我们可以看出,已经实现了并发的效果,两个协程都在执行,执行完成后,协程将会进行自动回收。

在上面的示例代码中,我们使用到了select{},这是为了保证主程序没有终止,在后续章节我们将进行具体介绍。

小结

Go语言的协程比较常用且便捷,是我们进行Go语言开发必须要掌握的知识,这对于之后的深入探索是比较重要的。

关于本节总结如下:

  • Go语言具备一种轻量级的线程:协程

  • 通过go关键字就可以快速开启协程

  • 协程的开销特别小,可以同时开启大量协程来满足需求

results matching ""

    No results matching ""